//给定一个链表，删除链表的倒数第 n 个节点，并且返回链表的头结点。 
//
// 示例： 
//
// 给定一个链表: 1->2->3->4->5, 和 n = 2.
//
//当删除了倒数第二个节点后，链表变为 1->2->3->5.
// 
//
// 说明： 
//
// 给定的 n 保证是有效的。 
//
// 进阶： 
//
// 你能尝试使用一趟扫描实现吗？ 
// Related Topics 链表 双指针 
// 👍 978 👎 0

package leetcode.editor.cn;

import common.bean.ListNode;
import common.util.MyUtil;

/**
 * Java：删除链表的倒数第N个节点
 *
 * @author changgui
 */
@SuppressWarnings("all")
public class P19_RemoveNthNodeFromEndOfList {
    public static void main(String[] args) {
        Solution solution = new P19_RemoveNthNodeFromEndOfList().new Solution();
        ListNode node = MyUtil.createNode(1, 2, 3, 4, 5);
        MyUtil.printListNode(solution.removeNthFromEnd(node, 5));

    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public ListNode removeNthFromEnd(ListNode head, int n) {
            ListNode preHead = new ListNode(0);
            preHead.next = head;
            ListNode two = preHead;
            for (int i = 0; i < n - 1; i++) {
                two = two.next;
            }
            for (ListNode one = preHead; one.next != null && two.next != null; one = one.next, two = two.next) {
                if (two.next.next == null) {
                    one.next = one.next.next;
                    break;
                }
            }
            return preHead.next;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}